﻿//CÁC HÀM HỖ TRỢ XỬ LÝ KIỂU CHUỖI VÀ ĐỊNH DẠNG TIỀN THEO CẤU HÌNH HỆ THỐNG MANH.NGUYEN - JAN, 26 - 2011
using System;
using System.Globalization;
using System.Text.RegularExpressions;
using Project.MVC;

namespace RealEstate.MVC.Web.Helper
{
    public static class StringHelper
    {
        /// <summary>
        /// Định dạng dấu phân cách tiền tệ
        /// </summary>
        /// <param name="number">Số cần định dạng</param>
        /// <param name="groupingSymbol">Ký hiệu phân cách</param>
        /// <param name="decimalSymbol">Ký hiệu thập phân</param>
        /// <param name="decimalPlaces">Số chữ số thập phân</param>
        /// <returns>Chuỗi đã định dạng</returns>
        public static string Format(double? number, string groupingSymbol, string decimalSymbol, int decimalPlaces)
        {
            if (number.HasValue)
            {
                if (number == 0) return "0";
                var numberFormat = new CultureInfo("vi-VN", false).NumberFormat;
                //KHÔNG LẤY GIÁ TRỊ THẬP PHÂN ĐỐI VỚI TIỀN
                
                number = decimalPlaces == 0 ? Math.Floor((double)number) : number;
                {
                    numberFormat.NumberDecimalDigits = decimalPlaces;
                    numberFormat.NumberGroupSeparator = groupingSymbol;
                    numberFormat.NumberDecimalSeparator = decimalSymbol;
                }
                return ((double)(number)).ToString("N", numberFormat);
            }
            else {
                return String.Empty;
            }
        }

        /// <summary>
        /// Định dạng dấu phân cách tiền tệ và có làm tròn
        /// </summary>
        /// <param name="number">Số cần định dạng</param>
        /// <param name="groupingSymbol">Ký hiệu phân cách</param>
        /// <param name="decimalSymbol">Ký hiệu thập phân</param>
        /// <param name="decimalPlaces">Số chữ số thập phân</param>
        /// <returns>Chuỗi đã định dạng</returns>
        public static string Format(this double? number, string groupingSymbol, string decimalSymbol, int decimalPlaces, bool isRound)
        {
            if (number == 0) return "0";
            var numberFormat = new CultureInfo("vi-VN", false).NumberFormat;
            var value = Math.Pow(10, AppConfigModel.CurrencyFormat);
            if (number != null)
            {
                if (isRound)
                {
                    //LÀM TRÒN THEO CẤU HÌNH HỆ THỐNG
                    number /= value;
                    number = Math.Round((double)number, 0) * value;
                }
                
                numberFormat.NumberGroupSeparator = groupingSymbol;
                numberFormat.NumberDecimalSeparator = decimalSymbol;
                numberFormat.NumberDecimalDigits = decimalPlaces;
            }
            return number != null ? ((double)(number)).ToString("N", numberFormat) : string.Empty;
        }

        public static string Truncate(this string str, int maxLength)
        {
            if (str == null || str.Length < maxLength || str.IndexOf(" ", maxLength) == -1)
                return str;

            return str.Substring(0, str.IndexOf(" ", maxLength)) + "...";
        }

        public static string ReadNumber(string value)
        {
            //CHUYỂN 1 SỐ ST THÀNH CHUỖI
            value = value.Replace(".", "").Replace(",", "");
            var result = "";

            var temp = 0L;

            if (!long.TryParse(value, out temp))
            {
                return "";
            }
            if (long.Parse(value) == 0L)
                return "không ";
            var i = value.Length - 1;
            while (i >= 2)
            {
                var t = value.Length % 3;
                string str = null;
                if (t != 0)
                {
                    str = value.Substring(0, t);
                    value = value.Remove(0, t);
                }
                else
                {
                    str = value.Substring(0, 3);
                    value = value.Remove(0, 3);
                }
                i = value.Length - 1;
                result = result + Convert3Number(str);
                if (string.IsNullOrEmpty(value))
                {
                    break;
                }
                if (value.Length == 3 | value.Length == 12 | value.Length == 21 | value.Length == 30 | value.Length == 39)
                {
                    if (str != "000")
                    {
                        result = result + "ngàn ";
                    }
                }
                else if (value.Length == 6 | value.Length == 15 | value.Length == 24 | value.Length == 33 | value.Length == 42)
                {
                    if (str != "000")
                    {
                        result = result + "triệu ";
                    }
                }
                else if (value.Length == 9 | value.Length == 18 | value.Length == 27 | value.Length == 36 | value.Length == 45)
                {
                    result = result + "tỷ ";
                }
            }
            result = result + Convert3Number(value);
            return result.Trim();
        }

        private static string Convert3Number(string str)
        {
            //chuyển nhóm 3 số thành chữ
            var tmp = str;
            var result = "";
            while (str.Length > 0)
            {
                var value = str.Substring(0, 1);
                switch (str.Length)
                {
                    case 3:
                        //var temp = 0;
                        if (int.Parse(str)!=0)
                        {
                            if (value != "0")
                            {
                                result = ConvertNumber(value) + "trăm ";
                            }
                            else
                            {
                                result = "không trăm ";
                            }
                        }
                        break;
                    case 2:
                        if (value != "0")
                        {
                            if (string.IsNullOrEmpty(result))
                            {
                                if (value == "1")
                                {
                                    result = "mười ";
                                }
                                else
                                {
                                    result = ConvertNumber(value) + "mươi ";
                                }
                            }
                            else if (value == "1")
                            {
                                result = result + "mười ";
                            }
                            else
                            {
                                result = result + ConvertNumber(value) + "mươi ";
                            }
                        }
                        break;
                    case 1:
                        switch (value)
                        {
                            case "5":
                                if (string.IsNullOrEmpty(result))
                                {
                                    //005 or 05
                                    if (tmp.Length == 3 | tmp.Length == 2)
                                    {
                                        result = "lẻ năm ";
                                        //5
                                    }
                                    else
                                    {
                                        result = ConvertNumber(value);
                                    }
                                    //125 or 25 or 105
                                }
                                else
                                {
                                    if (tmp.Substring(1, 1) == "0")
                                    {
                                        result = result + "lẻ năm ";
                                    }
                                    else
                                    {
                                        result = result + "lăm ";
                                    }
                                }
                                break;
                            case "1":
                                if (string.IsNullOrEmpty(result))
                                {
                                    //001 or 01
                                    if (tmp.Length == 3 | tmp.Length == 2)
                                    {
                                        result = "lẻ một ";
                                        //5
                                    }
                                    else
                                    {
                                        result = "một ";
                                    }
                                    //121 or 21 or 101
                                }
                                else
                                {
                                    //101  121
                                    switch (tmp.Length)
                                    {
                                        case 3:
                                            if (tmp.Substring(1, 1) == "0")
                                            {
                                                result = result + "lẻ một ";
                                            }
                                            else if (tmp.Substring(1, 1) == "1")
                                            {
                                                result = result + "một ";
                                            }
                                            else
                                            {
                                                result = result + "mốt ";
                                            }
                                            break;
                                        case 2:
                                            if (tmp.Substring(0, 1) == "0")
                                            {
                                                result = result + "lẻ một ";
                                            }
                                            else if (tmp.Substring(0, 1) == "1")
                                            {
                                                result = result + "một ";
                                            }
                                            else
                                            {
                                                result = result + "mốt ";
                                            }
                                            break;
                                    }
                                }
                                break;
                            default:
                                if (value != "0")
                                {
                                    //002
                                    if (string.IsNullOrEmpty(result))
                                    {
                                        //002 or 02
                                        if (tmp.Length == 3 | tmp.Length == 2)
                                        {
                                            result = "lẻ " + ConvertNumber(value);
                                            //2
                                        }
                                        else
                                        {
                                            result = ConvertNumber(value);
                                        }

                                        //123 or 23 or 103
                                    }
                                    else
                                    {
                                        if (tmp.Substring(1, 1) == "0")
                                        {
                                            result = result + "lẻ " + ConvertNumber(value);
                                        }
                                        else
                                        {
                                            result = result + ConvertNumber(value);
                                        }
                                    }
                                }
                                break;
                        }
                        break;
                }
                str = str.Remove(0, 1);
            }
            return result;
        }

        private static string ConvertNumber(string str)
        {
            switch (str)
            {
                case "0":
                    return "không ";
                case "1":
                    return "một ";
                case "2":
                    return "hai ";
                case "3":
                    return "ba ";
                case "4":
                    return "bốn ";
                case "5":
                    return "năm ";
                case "6":
                    return "sáu ";
                case "7":
                    return "bảy ";
                case "8":
                    return "tám ";
                case "9":
                    return "chín ";
            }
            return "";
        }

        /// <summary>
        /// son.le - 2011.07.01: kiểm tra chuổi có phải là số không
        /// </summary>
        /// <param name="value">Chuổi cần kiểm tra</param>
        public static bool IsNumeric(this string value)
        {
            double outNum;
            return double.TryParse(value, out outNum);
        }

        /// <summary>
        /// son.le - 2011.07.01: chuyển chuổi về kiểu Int
        /// </summary>
        /// <param name="value">Chuổi cần chuyển</param>
        /// <returns>Nếu không thành công trả về null</returns>
        public static int? ToInt32(this string value)
        {
            int outInt;
            if (int.TryParse(value, out outInt))
                return outInt;
            else
                return null;
        }

        /// <summary>
        /// Loại bỏ các ký tự đặc biệt trong mã
        /// </summary>
        public static string Remove(this string str)
        {
            if (!String.IsNullOrEmpty(str))
            {
                str = str.ToUpper().Trim();
                str = str.Replace('/', '-');

                //THAY THẾ CÁC MÃ CHỈ CHỨA CÁC KÝ TỰ TỪ A ĐẾN Z, 0 - 9
                const string pattern = "[^a-zA-Z_0-9]";
                
                //CÁC KÝ TỰ ĐẶC BIỆT CÒN LẠI ĐƯỢC THAY THẾ BẰNG KÝ TỰ "-"
                str = Regex.Replace(str, pattern, "-");

                return str;
            }
            else
            {
                return String.Empty;
            }
        }
    }
}
